<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // var data = {
    //     name:"张三",
    //     age:18,
    //     height:"173cm",
    //     weight:"70kg",
    // }

    // console.log(data.name);  //取值
    // data.name = '李四'
    // console.log(data);


    // 在对象取值或赋值时绑定一个拦截函数, -> 在对对象的某个属性取值和赋值时,进行拦截操作 

    // 原理 Object.defineProperty(targetObj,key,desc)  
    // targetObj 目标对象
    // key   需要拦截的属性名
    // desc  属性描述  / 配置拦截函数(对该属性进行取值和赋值时进行拦截)
    // (1)   Object.defineProperty(data,"sex",{
    //      value:"男",        // 设置属性值
    //      writable:false,    //  属性是否可以被修改
    //      enumerable:false,  // 属性是否可以被枚举(遍历)
    //      configurable:false,  // 属性描述是否可以修改设置或 是否可以该属性删除
    // })   

    // (2)  value  writable 配置和 get() set(){}  不能同时使用
    // Object.defineProperty(data,"sex",{
    //      enumerable:false,  // 属性是否可以被枚举(遍历)
    //      configurable:false,  // 属性描述是否可以修改设置或 是否可以该属性删除
    //      get(){
    //         console.log("取值拦截");
    //      }
    // })   



    var data = {
        name: "张三",
        age: 18,
        height: "173cm",
        weight: "70kg",
    }

    // Object.defineProperty(data, "sex", {
    //     value: "男",
    //     writable: false,    //  属性是否可以被修改
    //     enumerable: false,  // 属性是否可以被枚举(遍历)
    //     configurable: false,  // 属性描述是否可以修改设置或 是否可以该属性删除
    // })

    // console.log(delete data.sex);
    // console.log(data);

    // for(var key in data) {
    //     console.log(key)
    // }

    let defaultSex = "保密";  // 男
    Object.defineProperty(data, "sex", {
        enumerable: false,  // 属性是否可以被枚举(遍历)
        configurable: false,  // 属性描述是否可以修改设置或 是否可以该属性删除
        get: function () {
            console.log("取值拦截");
            var val = null;
            switch(defaultSex){
                case "男": val = 1;break;
                case "女": val = 0;break;
                case "保密": val = 2;break;
            }
            return val;
        },
        set: function (val) {
            console.log("赋值拦截",val);
            defaultSex = val;
        }
    })

    console.log(data.sex);  //  2
    data.sex = "男";
    console.log(data.sex);  // 1






</script>

</html>